#include <iostream>
#include <fstream> //文件输出
#include <math.h>  //主要生产波形使用SIN函数，所以弄了这个头

//wave文件的生成
using namespace std;

float dou = 256; //声音dou的频率264，这里为了凑整数用的256 HZ

struct WavHead
{
    char RIFF[4];   //头部分那个RIFF
    long int size0; //存的是后面所有文件大小
    char WAVE[4];
    char FMT[4];
    long int size1; //存的是fmt保存的大小，包含这之后，data前面几个，共16个
    short int fmttag;
    short int channel;
    long int samplespersec; //每秒采样数，用的是11025
    long int bytepersec;
    short int blockalign;
    short int bitpersamples;
    char DATA[4];
    long int size2; //剩下文件大小，也就是声音采样是大小，因为是一秒钟的内容，那么就是11025了。
};

int main()
{
    WavHead head = {{'R', 'I', 'F', 'F'}, 0, {'W', 'A', 'V', 'E'}, {'f', 'm', 't', ' '}, 16, 1, 1, 11025, 11025, 1, 8, {'d', 'a', 't', 'a'}, 0}; //初始化，没将声音采样文件大小赋值，后面修改
    head.size0 = 110250 + 16 + 8;
    head.size2 = 110250;
    char body[head.size2];                //打算将采样数据放在这个里面
    int i, i2;                            //为了声音不是很单调，用了两个循环，里面一层i是生成声音函数，外面那层i2，是生成不同频率的。
    float a = (head.samplespersec / dou); //是dou持续时间（1/dou)除以采样数（1/head.samplespersec），也就是一个dou的波形里有a个采样点，这里是43。
    for (i2 = 1; i2 <= 2; i2++)
    { //这里弄了两个声音,一个是256HZ，一个是512HZ

        for (i = 0 + head.size2 / 2 * (i2 - 1); i < head.size2 / 2 * i2; i++)
        {
            body[i] = (int)(64 * sin(6.28 / a * i * i2) + 128); //这个波用的是sina函数，以128（ox80）为中心的正弦波，实际上当采样点是0x80的时候是静音，大于则是正的，小于0X80则是负的，前面64则是声音大小，等于128的时候，生成的声音最大
        }
    }
    ofstream ocout;
    ocout.open("123.wav", ios::out | ios::binary); //打开（不存在时生成）123.wav

    ocout.write((char *)&head, sizeof head); //将文件头部分写进文件
    ocout.write((char *)&body, sizeof body); //将数据文件写入程序

    ocout.close();                                    //关闭文件
    cout << head.samplespersec << " " << dou << endl; // 调试的时候查看一下文件大小是否出错
    return 0;
}